// 好莱坞原则

// 好莱坞无疑是演员的天堂， 但好莱坞也有很多找不到工作的新人演员，
// 许多新人演员在好莱 坞把简历递给演艺公司之后就只有回家等待电话。
// 有时候该演员等得不耐烦了， 给演艺公司打电 话询问情况，
// 演艺公司往往这样回答: “不要来找我， 我会给你打电话。”
// 在设计中， 这样的规则就称为好莱坞原则。
// 在这一原则的指导下， 我们允许底层组件将自己 挂钩到高层组件中，
// 而高层组件会决定什么时候、 以何种方式去使用这些底层组件， 高层组件对 待底层组件的方式，
// 跟演艺公司对待新人演员一样， 都是“ 别调用我们， 我们会调用你”。

// 代码重构(好莱坞原则)

var Beverage = function(param) {
    var boilWater = function() {
        console.log('把水煮沸');
    };
    var brew = param.brew || function() {
        throw new Error('必须传递 brew 方法');
    };
    var pourInCup = param.pourInCup || function() {
        throw new Error('必须传递 pourInCup 方法');
    };
    var addCondiments = param.addCondiments || function() {
        throw new Error('必须传递 addCondiments 方法');
    };
    var F = function() {};
    F.prototype.init = function() {
        boilWater();
        brew();
        pourInCup();
        addCondiments();
    };
    return F;
};
var Coffee = Beverage({
    brew: function() {
        console.log('用沸水冲泡咖啡');
    },
    pourInCup: function() {
        console.log('把咖啡倒进杯子');
    },
    addCondiments: function() {
        console.log('加糖和牛奶');
    }
});
var Tea = Beverage({
    brew: function() {
        console.log('用沸水浸泡茶叶');
    },
    pourInCup: function() {
        console.log('把茶倒进杯子');
    },
    addCondiments: function() {
        console.log('加柠檬');
    }
});
var coffee = new Coffee();
coffee.init();
var tea = new Tea();
tea.init();

// 总结